#ifndef __STD_SERVER_H__
#define __STD_SERVER_H__

#include <iostream>
#include <memory>

// private
struct stdTcpSocketPrivate
{
    // 通信句柄（广泛的概念：可以是文件描述符、套接字描述符或其他类似的通信资源）
    int connfd;
    // 通信是否建立成功
    bool m_connected;
};

struct stdTcpServerPrivate
{
    // 监听的句柄
    int m_sockfd;
    // 服务器是否正在监听
    bool m_isRunning;
};

// 通信类
class StdTcpSocket
{
public:
    // 构造函数
    StdTcpSocket();
    // 析构函数
    ~StdTcpSocket();
public:
    // 连接服务器
    int connectToServer(const char *ip, int port);
    
    // 是否连接成功
    bool isConnected() const;

    // 发送数据
    int sendMessage(const std::string &sendMsg);
    int sendMessage(const void *sendMsg, size_t n);
     
    // 接收数据
    int recvMessage(std::string &recvMessage);
    int recvMessage(void *buf, size_t n);

    // 得到属性
    stdTcpSocketPrivate *getSockAttr() const;

private:
    // 智能指针
    std::unique_ptr<stdTcpSocketPrivate> m_sockAttr;
    
};

// 类型别名
using StdTcpSocketPtr = std::shared_ptr<StdTcpSocket>;

// 服务器类
class StdTcpServer
{
public:
    // 无参构造
    StdTcpServer();

    // 析构函数
    ~StdTcpServer();
public:
    // 设置监听
    bool setListen(int port);

    // 接收客户端的连接
    std::shared_ptr<StdTcpSocket> getClientSock();

private:
    // 成员属性

    // 端口信息
    int m_port;

    // 智能指针
    // 服务器的属性
    std::unique_ptr<stdTcpServerPrivate> m_tcpAttr;

};

#endif // __STD_SERVER_H__